#include "MySock.hpp"
#include <functional>
#include <signal.h>
#include <unistd.h>

using func_t = std::function<void(int)>;

class HttpServer
{
public:
    HttpServer(int16_t port, func_t func)
    :_listenSock(-1),_serveSock(-1), _port(port), _func(func)
    {}

    void init()
    {
        _listenSock = QiHai::Sock::socket();
        if (_listenSock < 0) exit(1);

        if (!QiHai::Sock::bind(_listenSock, _port)) exit(2);

        if (!QiHai::Sock::listen(_listenSock)) exit(3);
    }

    void start()
    {
        signal(SIGCHLD, SIG_IGN);  // 应用层设置为忽视，这样子进程退出就会自动被系统回收，不会产生僵尸进程了
        while (true)
        {
            _serveSock = QiHai::Sock::accept(_listenSock);
            if(_serveSock < 0) continue;

            // 创建子进程对其处理
            if(fork() == 0)
            {
                // 子进程
                close(_listenSock);
                _func(_serveSock);  // 传给上一层传入此函数去处理
                close(_serveSock);
                exit(0);
            }
            close(_serveSock);   
        }
    }
private:
    int _listenSock;
    int _serveSock;  // 服务套接字
    int16_t _port;
    func_t _func;
};